package org.graduation.recruitment.handler;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.graduation.recruitment.entity.exception.ServiceException;
import org.graduation.recruitment.utils.ResponseResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 * 用于处理REST请求的异常，并返回统一格式的错误响应信息。
 */
@RestControllerAdvice
@Slf4j
public class MyExceptionHandler {

    /**
     * 处理服务层抛出的特定异常
     *
     * @param request  HTTP请求对象，用于获取错误信息
     * @param response HTTP响应对象，用于设置响应状态码和响应体
     * @throws ServiceException 抛出具体的服务异常，以便被其他异常处理器捕获并处理
     */
    @RequestMapping("/error")
    public void error(HttpServletRequest request, HttpServletResponse response) throws ServiceException {
        String errorMessage = request.getAttribute("error").toString();
        throw new ServiceException(errorMessage);
    }

    /**
     * 处理自定义业务异常
     *
     * @param e 抛出的ServiceException异常对象
     * @return 返回表示操作失败的响应结果
     */
    @ExceptionHandler(value = ServiceException.class)
    public ResponseResult serviceException(ServiceException e) {
        log.error(e.toString());
        return ResponseResult.fail(e.getMessage());
    }

    /**
     * 处理空指针异常
     *
     * @param e 抛出的NullPointerException异常对象
     * @return 返回表示操作失败的响应结果，错误信息为"没有信息"
     */
    @ExceptionHandler(value = NullPointerException.class)
    public ResponseResult nullPointerException(NullPointerException e) {
        log.warn("没有信息", e);
        return ResponseResult.fail("没有信息");
    }

    /**
     * 处理未被捕获的通用异常
     *
     * @param e 抛出的Exception异常对象
     * @return 返回表示操作失败的响应结果，错误信息为"内部服务器错误"
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult exception(Exception e) {
        e.printStackTrace();
        return ResponseResult.fail("内部服务器错误");
    }
}
